const userModel = require("../model/user")
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const {jwtcode,port,host} = require("../config");
module.exports={
    //注册操作
    async register(ctx){
        //1. 获取用户名 & 密码
        let {name,password} = ctx.request.body
        //2. 对用户名和密码进行一次格式检验
        ctx.verifyParams({
            name: {
                type:'string',
                required:true
            },
            password:{
                type:'string',
                required:true
            }
        })
        //3.判断当前用户是否已经存在 如果存在则报409代表冲突
        const users = await userModel.find({name});
        if(users.length>=1){
            ctx.throw(409,"当前用户已经存在");
        }
        //4.对密码进行加密
        const saltRounds = 10;
        const salt = bcrypt.genSaltSync(saltRounds);
        password = bcrypt.hashSync(password, salt);
        //5.入库! create方法返回一个promise 该promise持有的值就是刚刚新增到数据库中的值
        //user上的属性 是删除不掉的!!!
        const user = await userModel.create({name,password});
        //6. 通过将password字段的select属性设置为false 在查询操作时 将password字段隐藏
        ctx.body=await userModel.findById(user._id);
    },
    //登录操作
    async login(ctx){
        //1. 获取用户名 & 密码(明文)
        const {name,password} = ctx.request.body;
        //2. 判断用户名和密码是否合法
        //3. 如果用户名不存在 返回404代表没有当前用户
        const users = await userModel.find({name}).select('+password');
        if(users.length===0) ctx.throw(404,"当前用户不存在")
        //4. 如果密码不合法   返回403拒绝用户登录
        if(!bcrypt.compareSync(password,users[0].password)) ctx.throw(403,"密码不正确")
        //5. 如果合法 返回token
        const token = jwt.sign({id:users[0]._id,name:users[0].name},jwtcode,{ expiresIn: "7d"});
        ctx.body= token
    },
    //上传头像(一定要处于登录状态 上传头像接口携带的id要与登录用户的id一致)
    async avatar(ctx){
        //1. 头像对应的照片要上传到 静态资源服务器(index.js koa-body)
        //2. 将头像的地址(在静态资源服务器上的地址)返回给前端
        //更新用户信息
        const name = ctx.request.files.file.path.split("\\").pop();
        const url = `http://${host}:${port}/${name}`;
        //将头像信息 入库(users)
        await userModel.findByIdAndUpdate(ctx.userInfo.id, { $set:{ avatar: url}})
        ctx.body= url;

    },
    //查询所有用户(模糊查询 分页)
    async getAllUsers(ctx){
        let {q="",pageNo,pageSize} = ctx.query;
        pageNo = Math.max(1,+pageNo);
        pageSize = Math.max(1,+pageSize);
        const users = await userModel.find({name:new RegExp(q)})
            .skip((pageNo-1)*pageSize).limit(pageSize)
        ctx.body = users
    }
}
